<?php
namespace daswork;

class Loader
{
    // protected static $instance = [];
    // 类名映射
    protected static $map = [];
    // 命名空间别名
    protected static $namespaceAilas = [];
    // // 自动加载的文件
    // private static $autoloadFiles = [];
    // 命名空间与路径映射
    private static $namespaces = [];
    // 保存已加载的类
    private static $classMaps = [];

    // // 自动加载
    // public static function autoload($class)
    // {
    //     // 检测命名空间别名
    //     if (!empty(self::$namespaces)) {
    //         $namespace = dirname($class);
    //         if (isset(self::$namespaces[$namespace])) {
    //             $original = self::$namespaces[$namespace] . '\\' . basename($class);
    //             if (class_exists($original)) {
    //                 return class_alias($original, $class, false);
    //             }
    //         }
    //     }

    //     if ($file = self::findFile($class)) {

    //         // Win环境严格区分大小写
    //         if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) {
    //             return false;
    //         }

    //         __include_file($file);
    //         return true;
    //     }
    // }

    private static function autoload($class)
    {
        if (in_array($class, self::$classMaps)) {
            return true;
        }

        if ($file = self::findFile($class)) {
            // Win环境严格区分大小写
            if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) {
                return false;
            }
            __include_file($file);
            self::$classMaps[] = $class;
            return true;
        }
    }
    
    public static function findFile($class)
    {
        if (IS_WIN) {
            $namespace = \dirname($class);
            // 有命名空间映射的
            if (isset(self::$namespaces[$namespace])) {
                $file = self::$namespaces[$namespace] . basename($class) . EXT;
                // var_dump($file);
                return $file;
            }
            // var_dump(substr($class,strpos($class, '\\') + 1));
            $model = substr($class, 0, strpos($class, '\\'));
            
            if ($model=='app') {
                $file = APP_PATH . DS. str_replace('\\', DS, substr($class, strpos($class, '\\') + 1)) . EXT;
    
                return $file;
            }
        } else {
            $class = str_replace('\\', '/', $class);
            $namespace = str_replace('/','\\',dirname($class));

            // 有命名空间映射的
            if (isset(self::$namespaces[$namespace])) {
                $file = self::$namespaces[$namespace] . basename($class) . EXT;

                return $file;
            }
            $model = substr($class, 0, strpos($class, '/'));
            if ($model=='app') {
                $file = APP_PATH . str_replace($model, '', $class) . EXT;
                // var_dump($class);
                return $file;
            }
        }
    }

    // 注册系统自动加载
    public static function register($autoload = '')
    {
        spl_autoload_register($autoload ?: 'daswork\\Loader::autoload', true, true);
        self::$namespaces = [
            'daswork' => CORE_PATH,
            'daswork\lib' => CORE_PATH . 'lib' . DS
        ];
    }
}

/**
 * 作用范围隔离
 *
 * @param $file
 * @return mixed
 */
function __include_file($file)
{
    return include $file;
}

function __require_file($file)
{
    return require $file;
}
